package com.cy;
/**
 * List接口
 * 	--1，概述
 * 		有序，有索引，可以重复。
 * 		可以根据索引查询/插入/删除/修改
 * 		是一个Collection的子接口，可以用父接口的功能，也可以进行扩展。
 * 	--2，方法们
 * 		--继承自父接口Collection的
 * 		--自己扩展的
 * 			void add(int index, E element)
 *           		在列表的指定位置插入指定元素（可选操作）。
 * 			boolean addAll(int index, Collection<? extends E> c)
 * 			E get(int index)
 * 			          返回列表中指定位置的元素。
 * 			int indexOf(Object o)
 * 			          返回此列表中第一次出现的指定元素的索引
 * 			int lastIndexOf(Object o)
 * 			          返回此列表中最后出现的指定元素的索引
 * 			ListIterator<E> listIterator()
 * 			          返回此列表元素的列表迭代器（按适当顺序）。
 * 			E remove(int index)
 * 			          移除列表中指定位置的元素（可选操作）。
 * 			E set(int index, E element)
 * 			          用指定元素替换列表中指定位置的元素（可选操作）。
 * 			List<E> subList(int fromIndex, int toIndex)
 */

import sun.java2d.pipe.SpanIterator;

import javax.swing.plaf.FontUIResource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

//测试 List接口
public class Test4 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(100);
        list.add(200);
        list.add(300);
        list.add(100);
        list.add(null);
        list.add(null);
        list.add(400);
        list.add(100);
        System.out.println(list);
        //[100, 200, 300, 100, null, null, 400, 100]  特点:有序 + 可以重复 + 可以存多个null

        System.out.println(list.get(3));//获取下标为3对应的元素
        System.out.println(list.indexOf(200));//获取200元素第一次出现的
        System.out.println(list.lastIndexOf(200));//获取200元素最后一次
        System.out.println(list.lastIndexOf(100));//获取100元素最后一次

        System.out.println(list.remove(1));//移除1下标处的元素
        System.out.println(list.set(5,666));//把5下标处的元素换成666
        System.out.println(list);
        //[100, 300, 100, null, null, 666, 100]
        List <Integer> list2=list.subList(2,6);//从2开始到6结束,截取子List[2,6)  不包含6
        System.out.println(list2);

        //[100, 300, 100, null, null, 666, 100]
        System.out.println(list);

        System.out.println(list.remove(new Integer(300)));

        //TODO 迭代List接口中元素的方式
        //方式1:: 继承自父接口的方法Iterator<E> iterator()
        System.out.println();
        System.out.println("=============");
        System.out.println(list);

        Iterator<Integer> it =list.iterator();
        while(it.hasNext()){
            Integer data =it.next();
            System.out.println(data);
        }

        //方式2:: List有下标,根据下标遍历for
        for(int i = 0;i<list.size();i++){
            Integer data =list.get(i);
            System.out.println(data);
        }
        //方式3:: foreach
        for(Integer x : list){
            System.out.println(x);
        }

        //方式4:: List子接口的扩展方法ListIterator<E> listIterator()
        ListIterator <Integer> it2 =list.listIterator();

        //顺序遍历
        while(it2.hasNext()){
                Integer data =it2.next();
            System.out.println(data);
        }

        while(it2.hasPrevious()){
           Integer data =it2.previous();
            System.out.println("data="+data);
        }

        method();

    }

    private static void method() {
        List <Integer> list = new ArrayList<>();
               list.add(100);
               list.add(200);
               list.add(300);
               list.add(null);
               list.add(null);
               list.add(200);
               list.add(100);
        System.out.println(list);

        //1.继承自父接口的方法Iterator<E> iterator()

        Iterator <Integer> it =list.iterator();
        while(it.hasNext()){
                Integer data =it.next();
            System.out.println(data);
        }

        System.out.println("=================");
        //2.for循环
        for(int i = 0;i<list.size();i++){
            Integer data =list.get(i);
            System.out.println(data);
        }
        System.out.println("=================");
        //3.foreach
        for(Integer z :list){
            System.out.println(z);
        }

        System.out.println("=================");
        //4.List子接口的扩展方法ListIterator<E> listIterator()  顺序遍历和逆向遍历
        ListIterator<Integer> it2=list.listIterator();
       while(it2.hasNext()){
        Integer data =it2.next();
           System.out.println(data);
       }

        System.out.println("=================");
        while(it2.hasPrevious()){
            Integer data =it2.previous();
            System.out.println("data=="+data);
        }

    }
}
